/*
 * $Id: GateProc.h,v 1.3 2005-07-24 11:39:14 bacon Exp $
 */

#ifndef _GATEPROC_CLASS_
#define _GATEPROC_CLASS_

#include <xpp/net/Sttp.h>
#include <xpp/net/Socket.h>
#include "Gate.h"

using namespace xpp::net;

class GateProc: public Sttp
{
public:
	GateProc (Socket* s, Address* a, Gate* g);
	~GateProc ();

	bool isExitRequested () const
	{
		return exit_requested;
	}

	enum {
		ERR_ARGCOUNT = Sttp::__NERRCODES__,
		ERR_ARG,
		ERR_PERM,
		ERR_SETV,
		ERR_SAVE,
		ERR_FIND,
		ERR_FILE,
		ERR_SVRDOWN,
		ERR_GENERAL,
		__NERRCODES__
	};
 
	const xp_char_t* errorStr () const;

protected:
	bool     exit_requested;
	Gate*    owner;

	int preprocess_cmd (const SttpCmd& cmd);

	int proc_discon (const SttpCmd& cmd);
	int proc_admath (const SttpCmd& cmd);
	int proc_shtdwn (const SttpCmd& cmd);
	int proc_envget (const SttpCmd& cmd);
	int proc_envset (const SttpCmd& cmd);
	int proc_envlst (const SttpCmd& cmd);
	int proc_logclr (const SttpCmd& cmd);
	int proc_loglst (const SttpCmd& cmd);
};


#define PROC_CHECK_ARG_COUNT(cmd,n) \
    if (cmd.argCount() != (n)) { \
        p_errcode = ERR_ARGCOUNT; \
        return -1; \
    }

#define PROC_CHECK_ARG_COUNT2(cmd,n1,n2) \
    if (cmd.argCount() != (n1) && cmd.argCount() != (n2)) { \
        p_errcode = ERR_ARGCOUNT; \
        return -1; \
    }

#define PROC_CHECK_ARG_COUNT_RANGE(cmd,n1,n2) \
    if (cmd.argCount() < (n1) || cmd.argCount() > (n2)) { \
        p_errcode = ERR_ARGCOUNT; \
        return -1; \
    }

#endif
